namespace zpl
{
#include <iostream>
    using namespace std;
#include <set>
#include <vector>

    int n;
    set<int> st;           // 用来存储存储2， 3， 4...因数
    vector<int> ret = {1}; // 用来存储最终最大乘积

    // 对于数n，拆分成n = a1 + a2 + a3 + a4 + .....ak     求a1 * a2 * a3 * a4 * a5.....ak  最大  的一种方案，如何拆分？
    // 贪心: 为了使拆分的若干数，乘积最大，1. 显然不相同的因数越多越好，2. 1不用考虑显然不能使乘积越大  8 - 2 = 6  6-3 = 3 3-4 = -1 ( 3, 4+[1])  10 - 2 = 8-3 = 5-4 = 1-5 = -4  k!=1 去掉k  abs(n-i)   10 -》st(2, 3, 5)
    // 8 : 2 + 3 + 4 ==9 - 8 ==1 去掉2 最后因数+1  8 = 3 + 5 最大      10： 2 + 3+ 4+ 5 == 14-10 ==4  k!=1 去掉k   10 = 2 + 3 + 5 最大

    // 高精度乘法    3 2 1 * 6
    void Mul(vector<int> &A, int b)
    {
        vector<int> tmp;
        int t = 0; // 代表进位
        for (int i = 0; i < A.size() || t; i++)
        {
            if (i < A.size())
                t += A[i] * b;
            tmp.push_back(t % 10);
            t /= 10;
        }
        A = tmp; // 将此次计算的最新乘积拷贝回去
    }

    int main()
    {
        cin >> n;
        // 1. 将n拆分成尽可能多的若干因数存储在set当中
        for (int i = 2;; i++)
        {
            if (n - i >= 0)
                st.insert(i);
            else if (n - i == -1)
            {
                st.erase(2);
                st.insert(i + 1);
                break;
            }
            else
            {
                st.erase(abs(n - i));
                st.insert(i);
                break;
            }
        }

        // 2. 将这若干个因数相乘起来，得到最大乘积
        // 由于最大乘积可能是个非常大的数字，所以我们需要高精度成分，将每一位存储在vector里面
        for (auto &x : st)
            Mul(ret, x);
        // 倒着存，从左遍历是从个位乘起
        // 结果倒着遍历
        for (int i = ret.size() - 1; i >= 0; i--)
            cout << ret[i];
        cout << endl;
        return 0;
    }

} // namespace zpl

namespace lpz
{
#include <iostream>
using namespace std;
#include <vector>
#include <algorithm>

    int n;
    const int N = 1e9 + 10;
    int t[N];   // ti表示第i个顾客需要的服务时间ti
    int sum[N]; // sum[i]表示t1 + t2 ....ti
    int ans;

    int main()
    {
        cin >> n;
        for (int i = 1; i <= n; i++)
            cin >> t[i];
        // 求 使得平均时间总和等待最小， 即ans = ((T1 + T2 + ....Tn) / n)min
        // 贪心  比如，大家共同需要洗澡，而有的人洗的时间特别长， 有的人洗的特别慢， 那么我们怎么办呢？先让慢的还是快的，贪心快的， 不然快的会等好长时间
        // 所以先让快的洗完，慢的洗
        // 1. 排序
        sort(t + 1, t + 1 + n); // 1 2 3 4 5             0 1  1+2 1+2+3 1+2+3+4    T1 = 0  T2 = t1   T3 = t1+t2  T4 = t1+t2+t3  T5 = t1+t2+t3+t4     ans = ans = (T1 + T2 + ....Tn） / n
        // 所以根据以上推出来的公式，可以证明，只需求出前缀和，求出来， 加上每个人的前缀和即可
        for (int i = 1; i <= n; i++)
            sum[i] = sum[i - 1] + t[i];
        for (int i = 1; i <= n; i++)
            ans += sum[i - 1]; // 对于当前人i，只需要等待前面i-1个人的总时间t1+t2+...ti-1
        return 0;
    }

} // namespace lpz
